import {MapData} from "@/class/map/MapData";
import {convert_gcj02_To_Gps84, convert_gps84_To_Gcj02, MyMapOpt} from "@/class/map/myMapOpt";
import {
    reqConvertGps84ToGcj02,
    reqDeleteMapData,
} from "@/api/mapdata";
import {reqPostMarker,reqPutMarker} from "@/api/marker"

import {requestGetData, requestIsSuccess} from "@/api/request";
import {getUUID, toJson} from "@/utils/utils";

export class MarkerData{
    constructor({mapData, marker}) {
        this.mapData=new MapData(mapData)
        this.marker=new Marker(marker)
    }

    /**
     * 移动到该要素
     * @param map
     */
    moveTo(map){
        /*const element = this.getDateInMap(map)
        var bounds = element.getBounds();
        map.setBounds(bounds)*/
        map.setCenter(this.marker.position)
        this.blinkData(map)
        /*const position = this.marker.position
        map.setCenter(position)*/
    }

    /**
     * 添加要素，并返回地图要素
     * @param map
     * @returns {*}
     */
    addToMap(map,mapCoordSys) {
        if(this.mapData.id===undefined){
            this.mapData.id=getUUID();
        }
        if(this.marker.id===undefined){
            this.marker.id=getUUID();
        }const result = this.getBaiduMapOpt(mapCoordSys)
        const feature = new AMap[MyMapOpt.MapType.Marker](result);
        feature.setExtData({
            id: this.mapData.id,
        })
        map.add(feature)
        return feature
    }

    /**
     * 返回地图需要的数据，如果坐标不是CJ02，转换为CJ02
     * @returns {Promise<any>}
     */
    getBaiduMapOpt(mapCoordSys) {
        const opt = JSON.parse(JSON.stringify(this.marker))
        //坐标转换
        switch (mapCoordSys){
            case MyMapOpt.MapCoordSys.CJ02:
                if(this.mapData.coordsys!==MyMapOpt.MapCoordSys.CJ02)
                    opt.position=convert_gps84_To_Gcj02(opt.position)
                break;
            case MyMapOpt.MapCoordSys.GPS:
                if(this.mapData.coordsys!==MyMapOpt.MapCoordSys.GPS)
                    opt.position=convert_gcj02_To_Gps84(opt.position)
                break;
        }
        return opt
    }

    /**
     * 更新点数据
     * @returns true;false
     */
    async update() {
        const result = await reqPutMarker(this)
        return requestIsSuccess(result)
    }
    /**
     * 添加点数据
     * @returns true;false
     */
    async upload() {
        const result = await reqPostMarker(this)
        return requestIsSuccess(result)
    }

    /**
     * 返回要素的原始设置
     * @returns {Marker}
     */
    getElement(){
        return this.marker
    }

    /**
     * 判断能否正确添加到该地图
     * @returns {boolean}
     */
    isElement(){
        return this.marker.position.length>0
    }

    /**
     * 返回复制对象
     * @returns {MarkerData}
     */
    getCopy(){
        return new MarkerData(this)
    }

    /**
     * 返回地图中的对象
     * @param map
     * @returns {*}
     */
    getDateInMap(map){
        return map.getAllOverlays().find(item=>{
            return item.getOptions().id===this.marker.id
        })
    }

    /**
     * 删除map中的元素
     * @param map
     */
    deleteDataInMap(map){
        map.remove(this.getDateInMap(map))
    }

    /**
     * 闪烁该要素
     * @param map
     */
    blinkData(map){
        var mapData = this.getDateInMap(map);
        //闪烁次数
        let blinkTimes=6
        let currentTimes=0
        const interval = setInterval(()=>{
            if(currentTimes<blinkTimes){
                if(mapData.getVisible()){
                    mapData.setOptions({
                        "visible":false
                    })
                }else{
                    mapData.setOptions({
                        "visible":true
                    })
                }
                currentTimes++
            }else{
                clearInterval(interval)
                mapData.setOptions({
                    "visible":true
                })
            }
        },100)
    }

    /**
     * 下载json数据
     */
    getJSON(){
        toJson(this.mapData.name,this)
    }
    /**
     * 删除要素
     */
    deleteElement(){
        return reqDeleteMapData(this.mapData.id)
    }
}
export class Marker{
    constructor({id, position, extData}) {
        this.id=id
        this.position=position
        this.extData=extData
    }
}